#define _CRT_SECURE_NO_WARNINGS 1

#include"Queue.h"

void QueueInit(Queue* Q)
{
	assert(Q);

	Q->head = NULL;
	Q->tail = NULL;
}

QNode* BuyQNode(Datatype x)
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->val = x;
	newnode->next = NULL;
	return newnode;
}

void QueuePush(Queue* Q, Datatype x)
{
	assert(Q);

	if (!Q->head)
	{
		Q->head = Q->tail = BuyQNode(x);
	}
	else
	{
		QNode* new = BuyQNode(x);
		Q->tail->next = new;
		Q->tail = new;
	}
}

void QueuePop(Queue* Q)
{
	assert(Q);
	assert(!QueueEmpty(Q));

	if (Q->head == Q->tail)
	{
		free(Q->head);
		Q->head = Q->tail = NULL;
	}
	else
	{
		QNode* next = Q->head->next;
		free(Q->head);
		Q->head = next;
	}
}

Datatype QueueRead(Queue* Q)
{
	assert(Q);
	assert(!QueueEmpty(Q));

	return Q->head->val;
}

bool QueueEmpty(Queue* Q)
{
	assert(Q);

	return Q->head == NULL;
}

void QueueDestroy(Queue* Q)
{
	assert(Q);
	
	while (Q->head)
	{
		QNode* next = Q->head->next;
		free(Q->head);
		Q->head = next;
	}

}

//int main()
//{
//	Queue Q;
//	QueueInit(&Q);
//	QueuePush(&Q, 1);
//	QueuePush(&Q, 2);
//	QueuePush(&Q, 3);
//	QueuePush(&Q, 4);
//	QueuePush(&Q, 5);
//
//	while (!QueueEmpty(&Q))
//	{
//		printf("%d ", QueueRead(&Q));
//		QueuePop(&Q);
//	}
//	printf("\n");
//	QueueDestroy(&Q);
//
//	return 0;
//}